Linux 检索·终端与 Vim
whereis 命令(全系统查询)
查询 目标 文件(它不搜索普通文件(如文本文件、配置文件等),仅针对二进制程序、源码和手册页)
shell
# 语法
whereis 文件名
# 示例
whereis nginx
# 结果: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/local/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz
# 注意:此法不是模糊查询which 命令(全系统查询)
查询 目标 可执行文件(若命令不存在或不在 $PATH 目录中,which 会返回空或报错)
shell
# 语法
which 文件名
# 示例
which nginx
# 结果:/usr/sbin/nginx
# 注意:此法不是模糊查询locate 命令(全系统查询)
快速查找文件或目录
shell
# locate 是一个用于快速查找文件或目录的命令工具,它通过搜索预先构建的数据库(通常是 /var/lib/mlocate/mlocate.db)来快速定位文件,
# 相比 find 命令效率更高(因为 find 是实时搜索文件系统)
# 安装
yum -y install mlocate
# 构建数据库
updatedb
# 执行命令
locate 文件名
locate 文件名 | grep 过滤字符
# 注意:此法是模糊查询,文件量很大,建议使用 grep 过滤find 命令(指定路径查询)
它可以查找指定路径( / 为全系统查找)下的文件或目录,根据多种条件(如名称、大小、权限、修改时间等)搜索文件,并支持对找到的文件执行指定操作
- 语法
shell
# 注意:此法不是模糊查询
# 基础语法
find [搜索路径] [匹配条件] [操作]
# 选项
搜索路径:指定查找的起始目录(默认为当前目录 .)。
匹配条件:定义查找的过滤规则(如名称、类型、大小等)。
操作:对找到的文件执行的动作(如删除、复制、执行命令等,默认为输出文件路径)。- 常见匹配条件
shell
# 按名称查找
find . -name "*.txt" # 查找当前目录下,名称以 .txt 结尾的文件
find /home -iname "*.txt" # 查找 /home 目录下,名称以 .txt 结尾且忽略大小写匹配的文件
# 按文件类型查找
# -type f:普通文件
# -type d:目录
# -type l:符号链接
# -type s:套接字文件
find /home -type d # 查找 /home 目录下,所有的目录
# 按大小查找
# 单位可以是 c(字节)、k(KB)、M(MB)、G(GB)
# + 表示大于,- 表示小于,无符号表示等于。
find /home -type f -size +100M # 查找 /home 下大于 100MB 的文件
# 按时间查找
# 操作类型:-mtime 修改时间(内容变更)、-atime 访问时间(内容读取)、-ctime 状态时间(权限 / 属性变更)
# 时间类型:-mtime [+/-]天数、-mmin [+/-]分钟
find /home -type f -mtime -7 # 查找 /home 下 7 天内修改过的文件
# 按权限查找
# -perm 权限值:精确匹配权限(如 644、755)。
find / -type f -perm 777 # 全盘查找权限为 777 的文件
# 按用户/组查找
# -user 用户名、-group 组名、-nouer 查找没有所属者的文件(用的最多,用于查找垃圾文件)、-uid 用户ID、-gid 组 ID
find / -user root # 全盘查找属于 root 用户的文件
# 可组合查询
# 与
find . -name "*.sh" -type f # 查找 .sh 结尾的普通文件
# 或
find . -name "a.txt" -o -name "b.txt" # 查找 a.txt 或 b.txt
# 非
find . ! -name "*.txt" # 查找不是 .txt 的文件- 常见操作
shell
# 删除文件
# -delete:直接删除找到的文件
find . -name "*.log" -mtime +30 -delete # 删除当前目录下 30 天前的 .log 文件
# 对查询的事件,执行命令:拷贝、修改、新增、查看等
# -exec 命令 {} \;:{} 代表找到的文件路径,\; 是命令结束符。
find . -name "*.txt" -exec cp {} /tmp/docs/ \; # 将找到的 .txt 文件复制到 /tmp/docs 目录
find . -type f -mtime -1 ! -user root # 查找当前目录中 24 小时内修改过的、不属于 root 的普通文件
find /etc -name "*.conf" -size +1k # 查找 /etc 下所有以 .conf 结尾且大于 1KB 的文件grep 搜索文件内容 和 结合管道符过滤命令结果
用于在文件或输入流中查找匹配指定模式(正则表达式)的行,并将匹配结果输出
- 查询规则
shell
# 基础语法
grep [选项] 模式 [文件...]
# 选项
# 匹配文件内容
-i # 忽略大小写
-w # 只匹配完整单词
-x # 只匹配整行完全相同的内容(精确匹配一行)
-n # 显示匹配行的行号。
-v # 取反,反向匹配
-c # 统计匹配的行数(不统计匹配次数,一行多匹配只算一次)
-r 或 -R # 递归搜索目录下的所有文件(包括子目录)
-l # 只输出包含匹配内容的文件名(而非具体行)。
-L # 反向输出不包含匹配内容的文件名。
# 模式
可以是普通字符串或正则表达式(默认支持基本正则表达式,加 -E 支持扩展正则表达式)。
# 文件
指定要搜索的文件,若不指定文件,则从标准输入(如管道 | 传递的内容)中读取。
# 示例
grep -i "hello" file.txt # 匹配行中出现 "Hello"、"HELLO" 的字符,并将行内容打印在控制台- 通配符(find 命令的条件适用通配符,查文件)
shell
* 匹配任意 多个 内容 find . -name "abc*" 匹配abc开头的文件
? 匹配任意 一个 内容 find . -name "a?c" 匹配a什么c的文件
[] 匹配[]中任意一个字符 find . -name [abc] 匹配abc任何一个的文件
[-] 匹配[]中任意范围内字符 find . -name [a-z] 匹配a-z的小写字母的文件
[^] 匹配[^]中任意一个字符 find . -name [^0-9] 匹配非数字的文件- 正则表达式(grep 命令的条件适用正则表达式,查文件内容)
shell
* 匹配前一个字符重复0次,或任意次 grep "abc*" file1
? 匹配前一个字符重复0次,或1次 grep "abc?" file1
[] 匹配[]中任意一个字符 grep [abc] file1
[-] 匹配[]中任意范围内字符 grep [a-z] file1
[^] 匹配[^]中任意一个字符 grep [^abc] file1
^ 匹配行首,限位符 grep ^abc file1
$ 匹配行尾,限位符 grep $abc file1- 管道符(常用)
管道符文本流: 将目录里的所有文件。临时转化为文本流,再使用文本命令进行操作
shell
ls l /etc | more 查询出etc目录下的所有文件,通过more命令,以文本的方式查看
netstat -tuln | grep 80 查询服务器上开启的服务端口,再通过 grep 80 过滤出 80 端口(用于查询某一端口是否开启)
netstat -an | grep ESTABLISHED | wc l 查询服务器上所有服务,再通过 grep ESTABLISHED过滤出正在操作服务器的服务,再次通过wc过滤(用于查看有几人在操作服务器)- 示例
shell
# 查询文件中内容
grep "hello" file.txt # 列出 file.txt 文件中,hello 字符出现的行
grep -i "hello" file.txt # 列出 file.txt 文件中,hello 字符出现的行,忽略大小写
grep -w "hello" file.txt # 列出 file.txt 文件中,hello 完整单词字符出现的行
grep -x "hello" file.txt # 列出 file.txt 文件中,hello 整行只是 hello 字符出现的行
grep -n "hello" file.txt # 列出 file.txt 文件中,hello 字符出现的行,外加行号
grep -v "hello" file.txt # 列出 file.txt 文件中,hello 字符 没 出现的行
grep -o "hello" file.txt # 列出 file.txt 文件中,hello 字符出现的行,且只列 hello 值
grep -c "hello" file.txt # 列出 file.txt 文件中,hello 字符出现的行数
grep -r "hello" ./www/ # 列出 递归搜索 当前www 目录下的所有文件,hello 字符出现的行
grep -l "hello" /home/* # 列出 /home/ 目录中,文件中含有 hello 字符内容的文件名
grep -L "hello" /home/* # 列出 /home/ 目录中,文件中 不 含有 hello 字符内容的文件名
grep -rn --include="*.txt" "hello" ./ # 列出当前目录下的所有.txt文件中含有 hello 字符内容的行和行号
# 管道符 - 过滤命令
ls | grep ".txt" # ls 命令输出结果中,过滤出含有 .txt 的内容(查找当前目录下的所有 txt 文件名)
ls l /etc | more # 查询出etc目录下的所有文件,通过more命令,以文本的方式查看
netstat -tuln | grep 80 # 查询服务器上开启的服务端口,再通过 grep 80 过滤出 80 端口(用于查询某一端口是否开启)
netstat -an | grep ESTABLISHED | wc l # 查询服务器上所有服务,再通过 grep ESTABLISHED过滤出正在操作服务器的服务,再次通过wc过滤(用于查看有几人在操作服务器)总结
- 若模式包含空格或特殊字符(如 $、*、( 等),需用单引号 ' 或双引号 " 包裹(单引号可避免 Shell 解析)
- 正则表达式中,. 匹配任意单个字符,* 匹配前一个字符 0 次或多次,^ 匹配行首,$ 匹配行尾。
- grep 通常结合 | 管道使用,用于过滤命令结果
在 Linux 系统中,终端管理是日常操作和系统管理的重要部分,涉及终端的创建、切换、会话管理、多窗口 / 标签操作等
终端操作
shell
# CentOS 默认提供 6 个虚拟控制台(TTY),可通过快捷键切换
六个本地字符终端:tty1 tty2 tty3 tty4 tty5 tty6
# 切换终端
切换字符终端命令:alt+f1 alt+f2 alt+f3 alt+f4 alt+f5 alt+f6 # windows
切换字符终端命令:cmd+1 cmd+2 cmd+3 cmd+4 cmd+5 cmd+6 # mac
# 新建终端
Ctrl + Shift + T # windows
command + T # mac
# 垂直 / 水平分割窗口
Ctrl + Shift + E # 垂直
Ctrl + Shift + O # 水平
command + O # mac
# 终端命令
Tab # 自动补全命令 / 文件名
ctrl + a # 将光标移到命令行头
ctrl + e # 将光标移到命令行尾
ctrl + c # 强制终止当前命令
ctrl + l # 清屏,相当于 clear
ctrl + u # 删除和剪切命令行光标之前的内容
ctrl + y # 粘贴 ctrl+u 剪切的命令
ctrl + r # 从历史命令中搜索
ctrl + d # 退出当前终端
ctrl + z # 暂停并放入后台
ctrl + s # 暂停屏幕输出
ctrl + q # 恢复屏幕输出
# 将字符输出到终端
echo "内容" # \n 是换行,\字符\ 是转义 , -e 是支持控制字符终端通信(消息、邮件)
- 查看当前有哪些用户在使用终端
shell
# 基础语法
w
# 结果
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
用户 终端 远程ip(本地为 - ) 做了什么- 向指定在线用户发送消息 write
在 Linux 系统中,write 命令用于向其他登录用户的终端发送消息。它允许用户之间在终端上进行实时的文本交流,消息会直接显示在接收方的终端上(无论对方当前在做什么操作)
shell
# 基础语法
write [目标用户名] [目标用户终端号] # [目标用户名] 为 w 结果中的 USER 列,[目标用户终端号] 为 w 结果中的 TTY 列
回车,建立会话
输入发送的内容
完成后,ctrl + D 终端会话- 向所有在线用户发送消息,包括自己 wall
shell
# 基础语法
wall
回车,建立会话
输入发送的内容
完成后,ctrl + D 终端会话- mail 命令,向其他用户发送邮件(用户可以是离线状态,上线后手动查看)
shell
# 基础语法
mail 用户名 # 向用户发送邮件
回车,建立会话
输入发送的内容:subject 是标题,下面是内容,使用 . 来结束输入,完成后 ctrl + D 发送
# 基础语法
mail # 用户查看收到的邮件(只能手动查看)
回车,建立会话:会显示邮箱列表,输入对应的第一列索引即可查看邮箱中对应标题的信息详情
# 删除邮箱
d 标题
# 保存邮件
s 标题
# 查看标题列表
h 回车
# 退出邮件会话
quit 回车 退出并保存
exit 回车 退出不保存
# 邮件的保存位置
/var/spool/mail/user1
# 发送指定文件给某个用户(很常见)
mail -s 指定邮件标题 目标用户 < 文件路径
mail -s "我发的邮件是给你看的" root < /root/xxx.txtvi 和 vim 编辑器
vi 是 1976 年诞生的基础编辑器,预装在几乎所有 Unix/Linux 系统中,功能简洁。vim(Vi Improved)则在 vi 的基础上开发,保留了所有 vi 操作,同时新增了大量实用功能,目前已成为主流。
vim 特点
- 完全兼容 vi 所有功能
- 语法高亮:不同文件类型(如代码、配置)显示不同颜色
- 代码缩进:自动对齐代码,支持自定义缩进规则
- 搜索高亮:搜索结果自动标色,便于定位
- 撤销 / 重做:支持多步撤销(vi 仅支持单步撤销)
进入文件编辑模式
shell
vim fileName # 有文件则进入,没有则创建文件进入vim 三种模式
vim 的三种模式:命令模式、输入模式、编辑模式
- 命令模式
控制台输入:vim fileName ,默认进入命令模式,输入以下命令从命令模式进入输入模式
shell
a # 光标所在字符后插入(追加)
A # 光标所在行尾处插入
i # 光标所在字符前插入(插入)
I # 光标所在行首处插入
o # 光标下插入新行(新行)
O # 光标上插入新行- 输入模式
在输入模式下,可执行录入文本等操作,按 ESC 键,从输入模式进入命令模式
- 编辑模式
在命令模式下,输入英文冒号
:进入编辑模式,编辑模式下的常见命令如下:
shell
w # 保存不退出
q # 退出不保存
wq # 保存并退出(快捷键 shift+zz)
q! # 强制退出不保存 (用于修改数据后,强制不保存退出)(所有人)
wq! # 强制保存并退出 (用于文件没有写权限的时候,修改后,保存退出)(管理员和文件当前所属者)命令模式下的常见操作
注意:以下命令都是在命令模式下执行的,不可在插入模式下执行
- 控制移动光标
shell
↑ ↓ ← → # 光标上下左右移动
gg # 光标移动到文件头
shift + g # 光标移动到文件尾
^ # 光标移动到行首
$ # 光标移动到行尾
:n # 移动到第几行- 删除、剪切字符
shell
x # 删除单个字母
nx # 删除n个字母
dd # 删除单行,或者剪切单行
ndd # 删除多行,或者剪切多行
:nl,n2d # 删除指定范围内的字符,或者剪切范围内字符
dG # 从光标所在行删除到行尾,放在行首就是清空文件- 复制(整行)
shell
yy # 复制光标所在行
nyy # 复制多行- 粘贴(整行)
shell
p # 粘贴到光标前
shift + p # 粘贴到光标后- 撤销
shell
u # 撤销
ctrl+r # 反撤销- 查找
shell
/查找内容 # 从光标所在处向下查找
?查找内容 # 从光标所在处向上查找
n # 下一个
shift + n # 上一个- 替换
shell
:1,100s/old/new/g # 替换第一行到第十行的所有old为new
:%s/old/new/g # 替换整个文件old为new
:1,10s/^/#/g # 注释1 ~ 10 行
:1,10s/^#//g # 取消1 ~ 10 行注释vim 常见配置命令
临时修改 vim 编辑器的展示
shell
:set nu # 显示行号
:set nonu # 取消行号
:syntax on # 显示特殊内容颜色
:syntax off # 不显示特殊内容颜色vim 常见操作
- 把其他文件的内容导入到光标位置,在命令模式下,光标先放在要粘贴的位置,执行
shell
:r /xxx/xxx/文件名 # 把文件内容导入到光标位置- 在 vim 中执行系统命令,且不影响 vim 操作,在 insert 编辑模式下,输入
shell
:!系统命令 # 比如,:!date, 在vim编辑器中,使用系统命令,并按任意键返回到vim编辑器中- 将系统命令的结果导入到 vim 编辑器中光标所在位置
shell
:r !命令 # 比如,:r !date ,将系统时间写入到光标所在位置- 注释快捷键设置,在命令行配置只是临时生效,系统重启将失效,永久生效需要写入配置文件:~/.vimvc 5.
shell
# 自定义快捷键语法::map 快捷键 快捷键执行的命令
:map ctrl+p I#<ESC> # 按ctrl+p时,在行首加上 # 注释
:map ctrl+b ctrl+x # 按ctrl+b时,删除行首第一个字母,取消注释- 字符串模板,可以把一些常用的长字符串设置成模板,方便编辑时使用,用于提升编辑效率,比如:邮箱
shell
:ab 源字符 替换为字符 # 字符替换
:ab myemail 872831515@qq.com # 当在文档中插入 myemail 时,会自动转化为 872831515@qq.com,建议源字符特殊且长一些否则影响编辑- 多文件打开,在vim中可同时打开多个文件
shell
vim -o /xxx/file1 /xxx/file2 # 小写的o,上下分屏打开两个文件,按ctrl + w 上下箭头进行文件切换
vim -O /xxx/file1 /xxx/file2 # 大写的O,左右分屏打开两个文件,按ctrl + w 左右箭头进行文件切换注意事项
- 当vim编辑器执行的过程中意外关闭了文件,会生成对应文件的.swp文件,再次进入时显示文件已经打开,原因是服务器备份了之前修改的文件
shell
# 解决方式一: 覆盖文件
vim -r 文件名
# 解决方式二:查看并删除swp文件
ls -la
rm -rf .文件名.swp- 所有命令必须在英文键盘下输入才生效
